package com.itheima.d5_resource;

import java.io.*;

/**
 * 目标：掌握释放资源的方式：try-with-resource
 *  和test2案例代码对比：
 *
 *  在test2中见识到了，有可能会显得太臃肿。JDK 7开始提供了更简单的资源释放方案：try-with-resource
 *
 *  try(定义资源1;定义资源2;…）{
 *  可能出现异常的代码;
 *  }catch(异常类名 变量名){
 *  异常的处理代码;
 *  }
 *
 * 该资源使用完毕后，会自动调用其close()方法，完成对资源的释放！
 *  () 中只能放置资源，否则报错
 *
 * 什么是资源呢？
 * 资源一般指的是最终实现了AutoCloseable接口。
 *
 * FileInputStream继承InputStream类，源码：
 * public class FileInputStream extends InputStream
 *
 * InputStream实现Closeable接口源码：
 * public abstract class InputStream implements Closeable
 *
 * Closeable接口继承AutoCloseable接口：
 * public interface Closeable extends AutoCloseable
 *
 * AutoCloseable接口源码：
 * public interface AutoCloseable
 *
 *
 * AutoCloseable的源码：有规定close方法用来代表释放底层资源
 * void close() throws Exception;
 *
 */
public class Test3 {
    public static void main(String[] args)  {
        //try with resource就是把要用到的流对象放在（）里面
        try (
                // 1、创建一个字节输入流管道与源文件接通
                InputStream is = new FileInputStream("Day08File-Io-App\\src\\itheima03.txt");
                // 2、创建一个字节输出流管道与目标文件接通。
                OutputStream os = new FileOutputStream("Day08File-Io-App\\src\\itheima03copy.txt");

                // 注意：这里只能放置资源对象。（流对象）
                // int age = 21;    //会报错
                // 什么是资源呢？Java中有规定：资源都是会实现AutoCloseable接口。资源都会有一个close方法，并且资源放到这里后
                // 用完之后，会被自动调用其close方法完成资源的释放操作。

                //人为定义的实现了AutoCloseable接口的资源，也是可以放置的
                MyConnection conn = new MyConnection();
                ){

            // 3、创建一个字节数组，负责转移字节数据。
            byte[] buffer = new byte[1024]; // 1KB.
            // 4、从字节输入流中读取字节数据，写出去到字节输出流中。读多少写出去多少。
            int len; // 记住每次读取了多少个字节。
            while ((len = is.read(buffer)) != -1){
                os.write(buffer, 0, len);
            }
            System.out.println(conn);
            System.out.println("复制完成！！");

        } catch (Exception e) {
            e.printStackTrace();
        }

        System.out.println("-------------------整套视频已学完，回过头来自己试一试----------------");

        try (
                InputStream zis = new FileInputStream("Day08File-Io-App\\src\\itheima02.txt");
                OutputStream zos = new FileOutputStream("Day08File-Io-App\\src\\itheima03copy.txt");
                ) {
            File zf = new File("Day08File-Io-App\\src\\itheima02.txt");
            byte[] zbyte = new byte[(int) zf.length()];
            int len;
            while ((len = zis.read(zbyte)) != -1){
                zos.write(zbyte,0,len);
            }
            System.out.println("自己尝试的也OK了");
        }catch (Exception z){
            z.printStackTrace();
        }
    }
}
